首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏勇哥编程游记

    温习 SPI 机制 (Java SPI 、Spring SPI、Dubbo SPI

    正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。 1 Java SPI 示例 本节通过一个示例演示 Java SPI 的使用方法。首先,我们定义一个接口,名称为 Robot。 3 Java SPI 机制源码解析 我们根据第一节 JDK SPI 示例,学习 ServiceLoader 类的实现。 5 Spring SPI 机制 Spring SPI 沿用了 Java SPI 的设计思想,Spring 采用的是 spring.factories 方式实现 SPI 机制,可以在不修改 Spring 和 Java SPI 一样,Spring SPI 也无法获取某个固定的实现,只能按顺序获取所有实现。 6 Dubbo SPI 机制 基于 Java SPI 的缺陷无法支持按需加载接口实现类,Dubbo 并未使用 Java SPI,而是重新实现了一套功能更强的 SPI 机制。

    1.1K10编辑于 2024-10-29
  • 来自专栏Java

    Java SPI

    概述SPI全称Service Provider Interface,即服务提供者接口,是Java的一种扩展机制。通过该机制,Java应用可以发现和使用对接口的外部实现。 这些由外部服务(通常是一个jar包,包含具体的实现类)提供实现的接口即被称为SPI,该外部服务即被称为Service Provider(服务提供者). 举例说明Java中的数据库连接驱动接口 java.sql.Driver,是一个SPI,不同的数据库厂商会提供各自的实现,例如Oracle提供的实现包含在ojdbc8包中,如下图,该包的META-INF/ 就可以发现并加载OracleDriver了ServiceLoader的使用ServiceLoader类用于发现和加载SPI的实现类。 其核心是一个LinkedHashMap属性(用来缓存SPI的实现类,key为实现类的全限定类名,value为实现类对象),和一个LazyIterator内部类(用来遍历和加载实现类)。

    41010编辑于 2024-08-02
  • 来自专栏Panda诚

    Java SPI机制

    什么是SPI SPI全称Service Provider Interface,翻译过来是服务提供接口。它是jdk内置的一种服务发现机制,它可以让服务定义与实现分离、解耦,大大提升了程序的扩展性。 Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制,提供了通过interface寻找implement的方法。 使用Java SPI需要符合的约定: Service provider提供Interface的具体实现后,在目录META-INF/services下的文件(以Interface全路径命名)中添加具体实现类的全路径名 SPI加载的核心就是ClassLoader的getResource系列方法,jdk提供了一个工具类,就是上面说的ServiceLoader。 } public void remove() { throw new UnsupportedOperationException(); } } 最后 使用Java

    1K30发布于 2020-09-01
  • 来自专栏Java项目实战

    Java SPI | Dubbo SPI |Spring SPI有什么区别

    Java SPI是JDK自带的一种SPI机制,它通过在META-INF/services目录下的配置文件中指定接口的实现类来实现。 Java SPI只能加载到类路径下的实现类,不支持动态添加和删除实现类。 Java SPI的实现代码示例如下: 定义接口 public interface MyService { void doSomething(); } 实现接口 public class MyServiceImpl 是Apache Dubbo框架自带的一种SPI机制,它在Java SPI基础上进行了扩展,支持动态添加和删除实现类。 Dubbo SPI的实现代码示例如下: 定义接口 @SPI("default") public interface MyService { void doSomething(); } 实现接口

    1.7K20编辑于 2023-03-31
  • 来自专栏程序猿杜小头

    聊聊 Java SPI

    The built-in service discovery mechanism in Java Running with Java 11.0.10 SPI (Service Provider Interface 得益于 Java SPI 机制,开发人员只需为第三方预留出 SPI 拓展接口,这样可以在不修改代码的前提下,通过增删第三方依赖来实现系统的灵活拓展。 要想成功地玩转 Java SPI,下面四个组件是缺一不可的: ① Service Provider Interface 服务供应商接口,即SPI拓展接口;只能是接口或抽象类。 java.sql.Driver是JDK为第三方数据库厂商预留的SPI拓展接口,主要用于构建Connection。 此外,Java SPI机制有一个较为明显的缺点:无法按需加载指定第三方SPI实现类!!!

    1.1K20编辑于 2022-12-01
  • 来自专栏Java面试教程

    Java SPI技术

    了不起: 运用到了JavaSPI技术 相关概念 Java SPI(Service Provider Interface)是一种服务发现机制,它允许第三方为现有的Java库提供实现。 SPI的主要目的是为了解耦,使得接口和实现可以独立地进行开发和部署。这种机制在许多Java库中都有应用,例如JDBC驱动程序、日志框架等。 当Java程序需要使用SPI时,它会通过java.util.ServiceLoader类来加载所有可用的实现。 SPI 机制"); } 运行结果如下 Logback info 打印日志:你好 Logback debug 打印日志:测试 Java SPI 机制 加载策略 当存在多个日志框架实现时,Java SPI 扩展性:SPI允许第三方为现有的Java库提供实现,这意味着库的功能可以轻松地进行扩展。开发者可以根据自己的需求为库提供定制的实现,而无需修改库本身。这使得库更具灵活性和可扩展性。

    62220编辑于 2023-09-06
  • 来自专栏后端码事

    Java SPI机制

    : classpath:META-INF/services/xxx.xxx.Calc 内容:需要加载的功能类 如:xxx.xxx.SqrtCalc #org.windwant.spring.core.spi.service.SinCalc org.windwant.spring.core.spi.service.SqrtCalc #org.windwant.spring.core.spi.service.LogCalc 则 运行服务加载类执行 https://github.com/windwant/spring-dubbo-service 官方文档:https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html

    38850发布于 2020-09-11
  • 来自专栏Java项目实战

    【视频讲解】Java SPI | Dubbo SPI |Spring SPI有什么区别 JAVA SPI设计模式之策略模式

    /jdk8u40/ri/openjdk-8u40-src-b25-10_feb_2015.zip https://www.apiref.com/java11-zh/java.base/java/util > serviceLoader = ServiceLoader.load(DynamicService.class); System.out.println("Java SPI"); ; import java.net.URL; import java.util.*; import java.util.stream.Collectors; /** * @author zhaokk 为了达到动态可插拔的效果,java提供了SPI以实现服务发现。 扩展的特性 Dubbo 中的扩展能力是从 JDK 标准的 SPI 扩展点发现机制加强而来,它改进了 JDK 标准的 SPI 以下问题: JDK 标准的 SPI 会一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时

    1.1K40编辑于 2024-05-08
  • 来自专栏Java架构师必看

    JavaSPI机制

    java.sql.Driver 是 Spi,com.mysql.jdbc.Driver 是 Spi 实现,其它的都是 Api。 和 API Java spi机制浅谈 java中的SPI机制 1 SPI机制简介 SPI的全名为Service Provider Interface.大多数开发人员可能不熟悉,因为这个是针对厂商或者插件的 在java.util.ServiceLoader的文档里有比较详细的介绍。简单的总结下java spi机制的思想。 java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。 2 SPI具体约定 java spi的具体约定为:当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。

    48130发布于 2021-07-08
  • 来自专栏Java项目实战

    Dubbo SPIJava SPI 区别?视频讲解

    通过Java SPI,开发者可以定义一组接口,并通过配置文件将实现类与接口关联起来。Java SPI的机制是Java虚拟机加载配置文件并实例化相应的实现类。2. 2.1.2 Java SPI的使用方式与Dubbo SPI相比,Java SPI的使用方式稍显复杂。 2.3.2 Java SPI的扩展机制相较于Dubbo SPIJava SPI的扩展机制较为简单。Java SPI只能定义一个接口与实现类之间的关系,无法定义多个实现类之间的优先级。 在Java SPI中,实现类的加载顺序是由Java虚拟机决定的,开发者无法干预。这限制了Java SPI在灵活性和动态性方面的应用。3. 总结Dubbo SPIJava SPI都是Java生态圈中常见的SPI框架,它们在使用方式、配置方式和扩展机制等方面存在一些区别。

    38120编辑于 2023-07-22
  • 来自专栏以Java架构赢天下

    java Spi与SpringFactoriesLoader

    其使用的方式和javaspi基本类似,我们可以先学习javaspi而且进一步学习SpringFactoriesLoader。 一、java spi 1、什么是Spi SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。 2、Spi的应用场景 SPI ( Service Provider Interface) 是 调用方 来制定接口规范,提供给外部来实现,调用方在调用时则 选择自己需要的外部实现。 从使用人员上来说,SPI 被框架扩展人员使用。

    66630发布于 2021-02-22
  • 来自专栏Java技术栈

    Java SPI 与 Dubbo SPI 有什么区别?

    JavaSPI是被用来设计给服务提供商做插件使用的。基于策略模式来实现动态加载的机制。 1、Java SPI 核心类:java.util.ServiceLoader ? 服务是一组众所周知的接口和(通常是抽象的)类。服务提供者是服务的特定实现。 另外,Java 核心技术系列教程和示例源码整理好了:https://github.com/javastacks/javastack Java SPI 不足之处: 不能按需加载。 Java SPI在加载扩展点的时候,会一次性加载所有可用的扩展点,很多是不需要的,会浪费系统资源 获取某个实现类的方式不够灵活,只能通过 Iterator 形式获取,不能根据某个参数来获取对应的实现类 到这里就有点明白了,又看到了熟悉的ServiceLoad.load(),这不是刚才讲的Java SPI嘛。

    1.2K30发布于 2021-06-16
  • 来自专栏JAVA 框架/源码学习

    JAVASPI机制

    JAVASPI机制是什么? 是不是看起来很高深的样子.其实特别简单 我们先来一个例子,大家更容易理解什么是JAVASPI机制: 首先我们提供了一个订单处理的接口 /** * @Author: lty * @Date: 2021 SPI的应用 这里我们以JDBC为例子 mysql-connector-java:5.1.32 包的 META-INF/services/ 目录下有个 java.sql.Driver ? 的实现、自动类型转换Type Conversion SPI(Converter SPI、Formatter SPI)等 Dubbo中也大量使用SPI的方式实现框架的扩展, 不过它对Java提供的原生SPI 总结 优点:使用Java SPI机制的优势是实现解耦,使得第三方服务模块的装配控制的逻辑与调用者的业务代码分离,而不是耦合在一起。应用程序可以根据实际业务情况启用框架扩展或替换框架组件。

    58610发布于 2021-01-28
  • 来自专栏孟君的编程札记

    Java SPI机制浅析

    这就是使用了SPI机制。如: mysql-connector ? JDK中的nio SPI ? 再如,logback-classic ? 接下来,我们就来聊聊java SPI机制,文章内容主要包含如下几个部分: SPI概念和规范 根据规范编写一个简单的SPI 小结 一、SPI概念和规范 1.1 SPI概念 SPI全称为Service 比如JDBC的数据库驱动模块,不同数据库连接驱动接口相同但实现类不同,通常各大厂商(如Mysql、Oracle)会根据一个统一的规范(java.sql.Driver)开发各自的驱动实现逻辑。 使用ServiceLoader package com.wangmengjun.tutorial.spi; import java.util.Iterator; import java.util.ServiceLoader spi的简单示例就完成了。

    66430发布于 2019-09-17
  • 来自专栏博岩Java大讲堂

    Java-SPI机制

    Java--SPI机制 SPI全称为Service Provider Interface,是JDK内置的一种服务提供发现机制。简单来说,它就是一种动态替换发现机制。 Java提供了很多服务提供者接口(Service Provider Interface,SPI),允许第三方为这些接口提供实现。常见的SPI有JDBC、JCE、JNDI、JAXP和JBI等。 这些SPI的接口是由Java核心库来提供,而SPI的实现则是作为Java应用所依赖的jar包被包含进类路径(CLASSPATH)中。例如:JDBC的实现mysql就是通过maven被依赖进来。 那么问题来了,SPI的接口是Java核心库的一部分,是由引导类加载器(Bootstrap Classloader)来加载的。 不过,在距离之前,还是想对spi的使用进行一个简单的说明。 spi使用 首先,通过一张图来看,完成spi的实现,需要哪些操作,需要遵循哪些规范? ?

    1.3K40发布于 2018-06-13
  • 来自专栏java相关

    javaSPI机制

    java SPI功能分享 1.什么是SPI SPI,Service Provider Interface,是有java提供的一套用来被第三方实现或者扩展的API,本质是通过基于接口的编程+策略模式+配置文件实现动态加载 主要是被框架的开发人员使用,比如JDBC中驱驱动java.sql.Driver接口,不同的数据库厂商通过实现次接口完成对数据库的操作,mysql等数据库都有不同的实现类提供给用户,而JavaSPI机制可以为某个接口寻找具体的实现类 使用分析 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写的类和接口组成 实现解耦,不需要改动源码就可以实现扩展 缺点:JDK标准的SPI会一次性实例化扩展点所有实现,如果有扩展实现则初始化很耗时(比如静态代码块初始化耗时长),如果没 用上也加载,则浪费资源 6.SPI机制的其他应用 Dubbo、spring、log4j等框架也大量使用了SPI机制

    65620编辑于 2022-01-05
  • 来自专栏single云社区

    Java——SPI机制详解】

    Java常用机制 - SPI机制 什么是SPI机制SPI机制的简单示例SPI机制的广泛应用 SPI机制 - JDBC DriverManager JDBC接口定义mysql实现postgresql实现使用方法源码实现 ,主要是被框架的开发人员使用,比如java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而JavaSPI机制可以为某个接口寻找服务实现 JavaSPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是 解耦。 JDK中查找服务的实现的工具类是:java.util.ServiceLoader。SPI机制的简单示例我们现在需要使用一个内容搜索接口,搜索的实现可能是基于文件系统的搜索,也可能是基于数据库的搜索。 这里就涉及到使用JavaSPI扩展机制来查找相关驱动的东西了,关于驱动的查找其实都在DriverManager中,DriverManager是Java中的实现,用来获取数据库连接,在DriverManager

    3.2K00编辑于 2024-05-31
  • 来自专栏码农那些事!!!

    聊聊 Java SPI 机制

    Java SPI 是基于接口的编程+策略模式+约定配置文件组合实现的动态加载机制,能够很方便的为某个接口寻找服务实现的机制。 今天这篇文章就来深入聊一下SPI。 什么是SPISPI 全称:Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制。这有点类似IOC的思想,将装配的控制权移到了程序之外。 JDK中查找服务的实现的工具类是:java.util.ServiceLoader。 SPI 的不足 不能按需加载,需要遍历所有的实现,并实例化,然后在循环中才能找到我们需要的实现。 总结 通过JavaSPI机制能够很方便的实现可插拔、解耦的功能设计,在日常的开发中要能想到该机制并能灵活的运用。

    50520编辑于 2023-05-01
  • 来自专栏码代码的陈同学

    Java基础之SPI机制

    欢迎访问陈同学博客原文 在前几天的译文 Java中的类加载器 中有部分关于ContextClassLoader的内容,涉及到SPI机制,本文将学习下相关知识。 什么是SPIJava中使用SPI机制的例子很多,例举几个: 数据库驱动 ( java.sql.Driver ),各数据库厂商(Mysql、Oracle等)可以遵守规范独立开发自己的驱动 Servlet容器初始化接口 SPI HelloWorld 首先,了解下SPI机制的约定(约定优于配置理念): 在 META-INF/services/ 目录下创建一个以 接口全限定名 命名的文件,文件内容为 实现类的全限定名 使用 命名的文件,内容为三位实现者: org.utopiavip.spi.Cat org.utopiavip.spi.Dog org.utopiavip.spi.Cuckoo 将项目打成jar包。 java.sql.DriverManager.getConnection("url", "user", "pwd") 在getConnection()的调用过程中,需要加载 java.sql.Driver

    84120发布于 2018-08-23
  • 来自专栏Linyb极客之路

    javaspi机制简介

    一、什么是SPI机制 SPI机制,是一种将服务接口与服务实现分离以达到解耦、大大提升了程序可扩展性的机制。 引入服务提供者就是引入了spi接口的实现者,通过本地的注册发现获取到具体的实现类,轻松可插拔,SPI实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载,为某个接口寻找服务实现的机制 二、SPI 具体约定 java spi的具体约定为:当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。 jdk提供服务实现查找的一个工具类:java.util.ServiceLoader 三、应用场景 1、可替换的插件机制 典型应用,jdbc的实现机制。 通常各大厂商(如Mysql、Oracle)会根据一个统一的规范(java.sql.Driver)开发各自的驱动实现逻辑。客户端使用jdbc时不需要去改变代码,直接引入不同的spi接口服务即可。

    1.3K30发布于 2019-07-08
领券